# StateMachine.gd
# 通用的组合式状态机

class_name StateMachine extends Node

# 导出一个变量，以便在编辑器中设置初始状态
@export var initial_state: State

# 当前状态的引用
var current_state: State

# 用于存储所有状态节点的字典 { "StateName": StateNode }
var states: Dictionary = {}

func _ready():
	# 遍历所有子节点
	for child in get_children():
		# 如果子节点是一个 State
		if child is State:
			# 将其添加到 states 字典中，键是节点的名字
			states[child.name] = child
			
			# 注意：我们不在状态内部调用 exit()
			# 状态机初始化时，确保所有状态都是“关闭”的
			# 只有当前状态才会被执行

	# 如果设置了初始状态
	if initial_state:
		# 切换到初始状态
		current_state = initial_state
		current_state.enter()
	else:
		# 如果没有设置，可以打印一个警告
		print_debug("StateMachine: Initial state not set.")


# 将 _process 逻辑传递给当前状态
func _process(delta: float):
	if current_state:
		current_state.process_logic(delta)

# 将 _physics_process 逻辑传递给当前状态
func _physics_process(delta: float):
	if current_state:
		current_state.physics_logic(delta)

# 将 _unhandled_input 逻辑传递给当前状态
#func _unhandled_input(event: InputEvent):
	#if current_state:
		#current_state.input_logic(event)

func _input(event: InputEvent) -> void:
	if current_state:
		current_state.input_logic(event)
# --- 核心功能：切换状态 ---
# 参数是新状态的节点名称 (StringName 或 String)
func transition_to(new_state_name: StringName):
	# 如果目标状态不存在，或已处于当前状态，则不执行任何操作
	if not states.has(new_state_name) or current_state.name == new_state_name:
		return

	# 调用当前状态的退出逻辑
	if current_state:
		current_state.exit()

	# 更新当前状态
	current_state = states[new_state_name]

	# 调用新状态的进入逻辑
	current_state.enter()
